#include <iostream>

// 单例模式

// 饿汉模式
// 在程序加载的时候就初始化好了实例
// 以空间换时间
class Singleton_hun
{
public:
    int GetDate() const { return _data; }
    static Singleton_hun& GetInstance()
    {
        return instance;
    }

private:
    Singleton_hun(): _data(99) { std::cout << "单例创建成功 - 饿汉" << std::endl; }
    Singleton_hun(const Singleton_hun&) = delete;
    Singleton_hun& operator=(const Singleton_hun&) = delete;
    ~Singleton_hun() {}

private:
    int _data; // for test

    static Singleton_hun instance; // 静态私有示例
};

Singleton_hun Singleton_hun::instance; // 静态成员必须在类外初始化


// 懒汉模式
// 懒加载——延迟加载的思想，在想要使用该对象时才进行创建实例
// 这里从用静态局部变量的方式来实现懒汉单例
// 在C++11之后，静态局部变量被多线程访问是是线程安全的
class Singleton_lazy
{
public:
    static Singleton_lazy& GetInstance()
    {
        static Singleton_lazy instance;
        return instance;
    }

    void show()
    {
        std::cout << __FILE__ << ":" << __LINE__ << std::endl;
    }
private:
    Singleton_lazy() { std::cout << "创建单例成功 - 懒汉" << std::endl; }
    Singleton_lazy(const Singleton_lazy&) = delete;
    Singleton_lazy& operator=(const Singleton_lazy&) = delete;
    ~Singleton_lazy() {}

};

int main()
{
    //std::cout << Singleton_hun::GetInstance().GetDate() << std::endl;
    Singleton_lazy::GetInstance().show();
    return 0;
}